#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：Employment_class 
@File    ：16_Queue_通信.py
@IDE     ：PyCharm 
@Author  ：XiaoDengYa
@Date    ：2021/6/6/006 21:09
"""
import random
import time
from multiprocessing import Process,Manager


#
# q = Queue(3)
# print(q.qsize())
# for i in range(3):
#     q.put("hh+{}".format(i))
# print(q.qsize()) # 返回当前队列的消息数量
# print(q.get()) # 获取队列中的一条消息，然后将其从列队中移除，block默认值为True；
# print(q.empty()) # 如果队列为空，则返回True，反之返回FALSE
# print(q.full()) # 如果队列满了，则返回True否则返回FALSE
# q.get_nowait()# 不等待直接获取数据
# q.put_nowait() # 不等待传输数据
#


# 写数据进程执行的代码
def wirte(q):
    for value in ["a","b","c"]:
        print("Put %s to queue.."%value)
        q.put(value)
        time.sleep(random.random())

# 读取数据进程执行代码
def read(q):
    while True:
        if not q.empty():
            value = q.get()
            print("Get %s from queue" %value)
            time.sleep(random.random())
        else:
            break

if __name__ == '__main__':
    q =   Manager().Queue()
    qw = Process(target=wirte,args=(q,))
    qr = Process(target=read,args=(q,))
    qw.start()
    qw.join()
    qr.start()
    qr.join()
    print("所有数据都已经写入")



# import os
# # 修改import中的Queue为Manager
# from multiprocessing import Manager, Pool
#
#
# def reader(q):
#     print("reader启动(%s),父进程为(%s)" % (os.getpid(), os.getppid()))
#     for i in range(q.qsize()):
#         print("reader从Queue获取到消息：%s" % q.get(True))
#
#
# def writer(q):
#     print("writer启动(%s),父进程为(%s)" % (os.getpid(), os.getppid()))
#     for i in "dongGe":
#         q.put(i)
#
#
# if __name__ == "__main__":
#     print("(%s) start" % os.getpid())
#     q = Manager().Queue()  # 使用Manager中的Queue来初始化
#     po = Pool()
#     # 使用阻塞模式创建进程，这样就不需要在reader中使用死循环了，可以让writer完全执行完成后，再用reader去读取
#     po.apply(writer, (q,))
#     po.apply(reader, (q,))
#     po.close()
#     po.join()
#     print("(%s) End" % os.getpid())
